package com.atguigu.securitydemo1.controller;


import com.atguigu.securitydemo1.entity.Users;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;


/**
 * 基本原理
 * 1.SpringSecurity本质是一个过滤器链,有很多过滤器
 *      比如:
 *          FilterSecurityInterceptor: 是一个方法级的过滤器,基本位于过滤器的最底部
 *          ExceptionTranslationFilter: 是个异常过滤器,用来处理认证授权过程中抛出的异常。
 *          UsernamePasswordAuthenticationFilter: 对/login的POST请求做拦截,效验表单中的用户名和密码
 *
 * 2.过滤器如何进行加载的?
 *       1.使用SpringSecurity配置过滤器
 *              * DelegationFilterProxy
 */
@RestController
@RequestMapping("/test")
public class TestController {

    /**
     * 启动服务后,想访问这个接口,因为自动装配了spring security框架
     * 会跳转到一个登录页面
     * 用户名:user
     * 密码是随机的,参考日志打印中的Using generated security password: 4547ce1c-5994-4c6f-9e93-ac6f5e925302
     * @return
     */
    @GetMapping("hello")
    public String add() {
        return "hello security ";
    }

    @GetMapping("/index")
    public String login() {
        return "hello index";
    }


    @GetMapping("/update")
    //指定用户具有某个角色就可以访问该方法
    // @Secured({"ROLE_normal", "ROLE_manager"})
    //在方法执行之前进行权限验证
    @PreAuthorize("hasAnyAuthority('admins')")
    //在方法执行之后校验,就算没有该方法没有权限,该方法也会先执行,执行完成后没有权限,导致无法
    @PostAuthorize("hasAnyAuthority('admin')")
    public String update() {
        System.out.println("update.....");

        return "hello update";

    }


    @RequestMapping("getAll")
    @PreAuthorize("hasRole('admins')")
    @PostFilter("filterObject.username == 'admin1'")
    @ResponseBody
    public List<Users> getAllUser(){
        ArrayList<Users> list = new ArrayList<>();
        list.add(new Users(1,"admin1","6666"));
        list.add(new Users(2,"admin2","888"));
        return list;
    }
}
